package com.tedu.review.day02;

/**
 * 普通类  √
 * 抽象类=抽象方法   关键字 abstract
 * 只有行为的概念，没有具体实现行为
 *
 * 与面对对象的多态有绝对关系
 * 产生子类【实现类】同时具备实现的属性和方法
 *
 * 什么情况下是使用
 * 复杂项目时，需要在不同类中实现，不同功能，首选抽象类【Android常用】
 *
 * 定义抽象类：
 * 修饰符 abstract 返回值 方法名（）;  定义抽象的方法，提供给子类使用
 *
 * 抽象类实例化：
 * 必须使用多态，向上造型，自身无法实例化，子类【实现类】
 *
 * 定义③   使用①    注意②
 * 抽象类使用注意：抽象类一般不能用 static 修饰；抽象类和抽象方法必须使用abstract关键字修饰
 *              不能定义 final 修饰的抽象方法、抽象静态属性、静态抽象方法；可定义静态方法、静态属性（但需要加空的代码块{}）。
 *              抽象类中可以有内部类、静态内部类以及构造器，抽象类可以继承抽象类
 *              抽象类可以继承抽象类，但实现类不能继承两个抽象类，实现只需要继承抽象子类（Java只允许单继承）。
 *
 */
abstract /*static*/ class Animals{     //拓展①抽象类可以使用static修饰吗？
    //类的定义：  有修饰符 +[abstract/static]+class+类名{}
    public abstract void say();//抽象方法：没有任何实现
    //②定义修饰为final的抽象方法  ×
    //public final abstract void sleep();
    //③定义属性|定义静态属性
    //abstract  int i;
    static int i;//声明为赋值
    //④定义抽象静态的属性  ×
    //static abstract int j;
    //⑤定义静态抽象方法 ×  语法：修饰符[static abstract]返回值 方法名
   // public abstract void eat();
    //⑥定义静态方法 √ 需要加代码块{}一定是空的 实现类不需要一定实现
    public static void eat(){};
    //⑦抽象类里面可以存在内部类吗(可以)，可以存在静态内部类吗（可以），
    public static class Sos{}
    //⑧抽象类里边构造器吗？   存在

    public Animals() {
    }
}
//⑨抽象类可以继承抽象类吗    可以
abstract class Thing extends Animals{
    //成员变量
    protected abstract int result();
}

 //实现类：子类 继承 抽象类  完成：抽象类方法
//⑩实现类【子类】可以继承两个抽象类吗  不可以（Java单继承）  但是，可以实现最终继承[子]抽象类
class People extends Animals{
public void say(){
    System.out.println("人----说话~~");
}
 }
 //实现类:假设Animals  有俩抽象方法  请问：子类需要实现抽象类全部抽象方法
class Monkey extends Animals{
     public void say(){
         System.out.println("猴----说话~~");
     }
 }
public class 抽象类 {
    public static void main(String[] args) {
        //抽象---实例化【创建对象】--【创建对象：不能直接创建】--多态：向上造型
        Animals a=new People();
        a.say();//输出：重写后的值  【方法互通】
        //实现抽象类实例化
        Animals a1=new Monkey();
        a1.say();//输出：重写后的值  【方法互通】
    }
}
























































